/**
 * 窗口方法类
 * 1、创建窗口 · createWindows(options: Object)
 * 2、创建系统托盘 · createTray()
 * 3、创建事件监听  · listen()
 */
import { BrowserWindow, app, Tray, Menu, ipcMain, BrowserWindowConstructorOptions } from 'electron';
import { is } from '@electron-toolkit/utils'
import path from 'path';
import icon from '../../../resources/icon.png?asset'

interface windowOption extends BrowserWindowConstructorOptions {
    id: string // 自定义id用于查找win窗口
    route?: string // 页面路由
    isMain?: boolean // 是否为主窗口
    isMultiWindow?: boolean // 是否可以多开窗口
    parentKey?: string //父窗口id
}

// 新建窗口时可以传入的一些默认options配置项
export const windowsCfg: windowOption = {
    id: "", // 自定义id用于查找win窗口
    route: "/", // 页面路由 --- '/message?id=123'
    isMain: false, // 是否为主窗口（当为true时会替代当前主窗口）
    isMultiWindow: false,
    parentKey: "",
    title: "UE控制器", // 窗口标题
    width: 1088, // 窗口宽度
    height: 616, // 窗口高度
    resizable: true, // 窗口是否可缩放
    fullscreen: false, // 窗口是否应全屏显示。明确设置为false全屏时，macOS 上的按钮将被隐藏或禁用。默认值为false。
    fullscreenable: false, // 窗口是否可以进入全屏模式。在 macOS 上，最大化/缩放按钮是否应切换全屏模式或最大化窗口。默认值为true
    backgroundColor: "#222222", // 窗口背景色
    autoHideMenuBar: true, // 除非按下该键，否则自动隐藏菜单栏。默认值为false
    minimizable: true, // 是否可以最小化
    maximizable: true, // 是否可以最大化
    transparent: false, // 是否为透明背景色
    frame: false, // 指定false创建 无框窗口。默认值为true。
    modal: false, // 是否模态窗口 -- 模态窗口是禁用父窗口的子窗口，创建模态窗口必须设置parent和modal选项【父窗口不能操作】
    webPreferences: {
        contextIsolation: true,
        nodeIntegration: true,
        webSecurity: true,
        preload: path.join(__dirname, '../preload/index.js')
    }
}

interface Group{
    [key: string]:{
        route: string | undefined, // 窗口页面路由
        winId: number, // 窗口生成的id--用于维护
        win: BrowserWindow // 窗口实例对象
        isMain: boolean | undefined // 是否为主窗口
        isMultiWindow?: boolean
    }
}
export class WindowOption{
    main: BrowserWindow | null // 主窗口
    group: Group // 窗口组
    tray: Tray | null // 系统托盘
    // 构造函数
    constructor(){
        this.main = null
        this.group = {}
        this.tray = null
    }

    // 获取窗口组中的某一个
    getWindowItem(id: string): any{
        return this.group[id]
    }

    // 创建窗口
    createWindow(args: windowOption){
        console.log("----------- create window -----------")

        let options = Object.assign({},windowsCfg,args)
        // 先判断是否存在
        const oldWin = this.getWindowItem(options.id)
        if(oldWin&&oldWin.winId&&!oldWin.isMultiWindow){
            // 窗口已存在
            oldWin.win.show()
            oldWin.win.focus()
            return
        }
        
        // 判断是否有父窗口
        if(options.parentKey){
            options.parent = this.getWindowItem(options.id).win // 获取父窗口
        }
        // 创建窗口
        const win = new BrowserWindow(options as windowOption)
        
        // 是否为主窗口
        if(options.isMain){
            if(this.main){
                this.main.close()
            }
            for(let key in this.group){
                if(this.group[key]) this.group[key].win.close()
                delete this.group[key]
            }
            this.main = win
        }

        // 新增到group组
        this.group[options.id] = {
            route: options.route,
            winId: win.id,
            win: win,
            isMain: options.isMain,
            isMultiWindow: options.isMultiWindow
        }
        
        win.on('close',()=>win.setOpacity(0)) // 窗口关闭时隐藏窗口
        // 打开网址（加载页面）
        let winURL
        // 开发环境下，使用本地渲染进程
        if(is.dev && process.env['ELECTRON_RENDERER_URL'] && !app.isPackaged){
            winURL = options.route ? process.env['ELECTRON_RENDERER_URL']+'/#'+options.route : process.env['ELECTRON_RENDERER_URL']
            console.log(666,winURL)
        }else{
            winURL = options.route ? path.join(__dirname, '../renderer/index.html')+'/#'+options.route : path.join(__dirname, '../renderer/index.html')
        }
        // console.log("窗口URL："+winURL)
        // 加载页面
        win.loadURL(winURL)

        // 窗口初始化完成后显示窗口
        win.once('ready-to-show',()=>{
            win.show()
        })
    }
    // 创建系统托盘
    createTray() {
        console.log("-----------开始创建托盘------------")
        const contextMenu = Menu.buildFromTemplate([
            {
                label: "注销",
                click: () => {
                    // app.quit()
                    console.log("注销")
                    // 主进程发送消息，通知渲染进程注销当前登录用户 -- todo
                }
            },
            {
                type: "separator" // 分割线
            },
            {
                label: "打开控制台",
                click: () => {
                    // app.quit()
                    // console.log("注销")
                    this.main?.webContents.openDevTools()
                }
            },
            {
                type: "separator" // 分割线
            },
            {
                label: "退出",
                role: "quit" // 退出应用---使用内置的菜单功能就不需要click事件了
            },
        ])
        this.tray = new Tray(icon)
        // 点击托盘显示菜单
        this.tray.on('click', () => {
            for(let key in this.group){
                if(this.group[key]) this.getWindowItem(key).win.show()
            }
        })
        // 处理右键菜单
        this.tray.on('right-click',()=>{
            this.tray?.popUpContextMenu(contextMenu)
        })
        this.tray.setToolTip('Electron App') // 设置托盘提示信息
        // 注册快捷键

    }
    // 监听事件
    listen(){
        console.log("-----------开始监听事件------------")
        // 固定窗口
        ipcMain.on('pinUp',(event: Electron.IpcMainEvent, id)=>{
            console.log("固定窗口",event)
            event.preventDefault()
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win.isAlwaysOnTop()){
                    win.setAlwaysOnTop(false) // 取消固定窗口
                }else{
                    win.setAlwaysOnTop(true) // 固定窗口
                }
            }
        })
        // 隐藏窗口
        ipcMain.on('window-hide',(event: Electron.IpcMainEvent, id)=>{
            console.log("隐藏窗口",id)
            event.preventDefault()
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win){
                    win.hide()
                }
            } else {
                // 未提供id则隐藏所有
                for(let key in this.group){
                    if(this.group[key]) this.group[key].win.hide()
                }
            }
        })
        // 显示窗口
        ipcMain.on('window-show',(event: Electron.IpcMainEvent, id)=>{
            console.log("显示窗口",id)
            event.preventDefault() // 阻止默认行为
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win){
                    win.show()
                }
            } else {
                // 未提供id则显示所有
                for(let key in this.group){
                    if(this.group[key]) this.group[key].win.show()
                }
            }
        })
        // 最小化窗口
        ipcMain.on('window-minimize',(event: Electron.IpcMainEvent, id)=>{
            console.log("最小化窗口",id)
            event.preventDefault()
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win){
                    win.minimize()
                }
            } else {
                // 未提供id则最小化所有
                for(let key in this.group){
                    if(this.group[key]) this.group[key].win.minimize()
                }
            }
        })
        // 最大化窗口
        ipcMain.on('window-maximize',(event: Electron.IpcMainEvent, id)=>{
            console.log("最大化窗口",id)
            event.preventDefault()
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win){
                    if(win.isMaximized()){
                        win.unmaximize()
                    }else{
                        win.maximize()
                    }
                }
            } else {
                // 未提供id则最大化所有
                for(let key in this.group){
                    if(this.group[key]) this.group[key].win.maximize()
                }
            }
        })
        // 关闭窗口
        ipcMain.on('window-close',(event: Electron.IpcMainEvent, id)=>{
            console.log("关闭窗口999",id)
            // const groupd = BrowserWindow.getAllWindows()
            event.preventDefault()
            if(id){
                let win: BrowserWindow = this.getWindowItem(id).win
                if(win){
                    // console.log(this.main.id)
                    win.close()
                    delete this.group[id]
                }
            } else {
                // 未提供id则关闭所有
                for(let key in this.group){
                    console.log(key,this.group,this.group[key])
                    if(this.group[key]) this.group[key].win.close()
                }
                this.group = {}
            }
        })
        // 创建窗口
        ipcMain.on('window-new',(event: Electron.IpcMainEvent, options)=>this.createWindow(options))
    }
}
